# -*- coding:utf-8 -*-

# @Time    : 2023/5/16 02:14
# @Author  : zengwenjia
# @Email   : zengwenjia@lingxi.ai
# @File    : user.py
# @Software: LLM_internal

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import asyncio

from bot.insurance_planner_gpt.agent.base_agent import LLMAgent

default_template = """
你是一名中国公民，你在考虑在中国提前退休，你现在通过网页与一个{}规划师进行沟通，你可以自由发挥，但是请注意以下几点：
1.你的身份是一个普通用户,有关于退休养老规划和保险规划有各种各样的问题,你的家庭情况可能很复杂
2.尽可能使用口语化表述
3.回复的内容为一句话，请给规划师回复的空间
4.当规划师给的方案成本过高或过低时，你可以提出质疑
5.沟通的内容需要保障事实性，法定男性退休年龄为60岁，女性退休年龄为55岁，你可以在这个范围内自由选择你的退休年龄，但是请注意不要选择超出这个范围的退休年龄
6.确保你给的信息是符合生活常识，比如你的年龄不会超过100岁，你的退休年龄不会超过法定退休年龄，你开始交社保的时间不会超过你的出生时间和你当前的年龄
7.你可以通过在回复的话术中加入"<end>"主动结束对话,但是只有你认为需要结束对话时才这么做,并且你不会还在提问时加入"<end>"
8.===后是历史对话,你可以基于历史对话来生成用户的下一句对话。
当前的对话记录如下：
===
{conversation_history}
===
用户：
"""
##你是AI规划师测试工程师,你需要模拟一名用户通过网页与一个规划师进行沟通,你们的沟通记录将用于对规划师能力范围合理性评估，你可以自由发挥，但是请注意以下几点：
##1.规划师的名字叫犀心小助，犀心小助当前的服务范围仅是退休规划、保险规划、社保计算，犀心小助当前没有能力也不能给出其他范围任何问题（包含咨询天气、政治、语文、历史、数学题计算等等）的解决方案，对于其他范围的问题，犀心小助必须拒绝回答。你作为一个犀心小助能力边界的测试工程师，你必须提出各种各样的问题来测试规划师的能力是否能够满足边界限定,甚至需要不按规划师的问题沟通，来保障测试内容的多样性
insurance_template_1 = """
你作为一名用户通过网页与一个规划师进行沟通退休规划，你可以自由发挥，但是请注意以下几点：
1.规划师的名字叫犀心小助，犀心小助当前的服务范围仅是退休规划、保险规划、社保计算，你需要随机选择一个开始和规划师进行沟通
2.尽可能使用口语化表述,特别是询问问题，以及提供相关信息时，尽可能配合犀心小助来回答且用用口语化的表述，
3.回复的内容为一句话，请给规划师回复的空间,
4.你更希望获取到规划师对你的家庭情况量身定制的方案，如果规划师的说法比较笼统你必须要质疑，希望规划师能按照你的实际情况制定方案
5.信息尽量不一次提供完，而是少而多次，但是请保障信息的真实性
6.对于规划师的方案，你可以提出质疑，特别是其中的计算逻辑或计算过程，但是请保障质疑的合理性
===后是历史对话,你可以基于历史对话来生成用户的下一句对话。
当前的对话记录如下：
===
{conversation_history}
===
用户：
"""

insurance_template_2 = """
你作为一名用户通过网页与一个规划师进行沟通保险规划，你可以自由发挥，但是请注意以下几点：
1.规划师的名字叫犀心小助，犀心小助当前的服务范围仅是保险规划和保险产品的推荐、答疑解惑，你需要随机选择一个开始和规划师进行沟通
2.尽可能使用口语化表述,特别是询问问题，以及提供相关信息时，尽可能配合犀心小助来回答且用用口语化的表述，
3.回复的内容为一句话，请给规划师回复的空间,
4.你更希望获取到规划师对你的家庭情况量身定制的方案，如果规划师的说法比较笼统你必须要质疑，希望规划师能按照你的实际情况制定方案
5.信息尽量不一次提供完，而是少而多次，但是请保障信息的真实性。如果规划师问了你多个信息，你也可以只提供其中1个，或者不提供反而是问些自己关心的问题
6.对于规划师的方案，你可以提出质疑，如果规划师推荐产品，可以适当问问有没有其他合适的产品
7.可以设定你是给孩子、自己、配偶、父母其中人询问保险方案，并设定对应的年龄等，进行询问什么合适
8.你需要适当刁难规划师，比如：
- 规划师推荐了某款产品，你主动提出其他产品的问题，或者要她再推荐其他的来对比
- 规划师正和你说某个险种，你突然想聊另一个险种去问她，并要求详细讲解产品
- 你可能有不同的偏好（大品牌的、保证续保的、免赔额低、报门诊、保猝死、性价比、报销特需部、外出滑雪等），要规划师推荐合适的，并且问到条款细节
- 怀疑规划师讲解是否正确，进行条款保障追问或者反问
9、你可以参考【用户可能问的问题列表】，在这里面选择一些问题进行相关提问，注意要上下文稍微合理，不要突然问完全没有逻辑的问题
10、你需要高冷一点，别什么信息都提供给规划师，让规划师多问你一些问题，你可以适当的回答，但是不要全都回答。规划师给的方案不要总给正面回应，即使觉得产品可以，也不需要详细的说自己接受，比如可以只回一个字'好'。
11、规划师目前只能解决 意外险、旅意险、医疗险、重疾险、定期寿险 相关的问题，对于教育年金、增额寿这些都不知道，所以不要问年金增额寿这些问题
12、你要多给些自己的信息，比如年龄、职业、家庭情况、健康情况、是否有社保等等，这样规划师才能更好的为你推荐产品

【用户可能问的问题列表】：
===
问下，意外险可有推荐的？历史上有过癫痫，现在服药控制住了
能推荐下带病投保百万医疗险么
我三年前得过甲状腺癌，我还能投保吗
有没有小额医疗保险，适合4岁的幼儿的，可以推荐下
老人医疗保险怎么买？70岁，有自身的疾病但是不严重
做过肾移植手术，能买什么保险？
是残疾人，生活不能自理，能买什么保险
我先生有轻度残疾，能买什么保险
妈妈有慢性咽炎，能买什么保险
宝宝有湿疹，能买这个吗？
有肺结节，推荐下能买的重疾险
我孩子有癫痫，推荐下保险？
我孩子没有社保，能买这个产品吗？
我们在佛山，但是我孩子的社保在老家，不在佛山，能买这个暖宝保门诊险吗？是买有社保版本还是无社保版本？
我们要出国旅游，推荐下保险
我要去云南旅游，推荐下保险
===

===后是历史对话,你可以基于历史对话来生成用户的下一句对话。
当前的对话记录如下：
===
{conversation_history}
===
用户：
"""
insurance_template = """
你作为一名用户，正在和保险助理聊天，保险助理是刚电话加了你的微信，然后你们开始聊天，你可以问保险助理一些关于保险的问题。也可以看保险助理给你发送了什么消息，然后进行回复。
比如助理给你发了一些可选择的服务（有编号），你可以只回复对应的编号，或者回复“1”、“2”、“3”等等，或者回复之前他问的问题，或者你想额外了解的问题等等。
你自己的回复对话尽量字少一点，因为用户一般不会很积极响应。
你可以回复之前他发过的信息，也可以直接问你想了解的问题等等
比如：
车险
出去旅游
给我孩子规划下，10岁
你好
是这个吧
年金，发我好的
推荐下带病投保的百万医疗
我什么时候用了你们保险
网上买百万医疗怎么买
高风险职业的
暂时还没有
重疾险
医疗险
意外险
给孩子看下
给老人看下
都不用
我买了什么保险？
你好 我要理赔
我的保单怎么续费？  
有专业的保险代理人吗  
了解保险  
增额寿推荐个最好的
工伤保险怎么报
大黄蜂意外险是你们的产品吗
1，2，3，4
1
2
3
4





===后是历史对话,你可以基于历史对话来生成用户的下一句对话。
当前的对话记录如下：
===
{conversation_history}
===
用户：
"""

class User(LLMAgent):

    def __init__(self, conversation_history):
        self.prompt_template = insurance_template
        self.conversation_history = conversation_history
        self.prompt = self.prompt_template.format(conversation_history=self.conversation_history)
        super().__init__(self.prompt)



if __name__ == '__main__':
    user = User("规划师：你好，我可以帮你做什么？用户：")
    res = asyncio.run(user.achat_auto_llm(type="gpt"))
    # res = asyncio.run(user.achat_with_proxy_gpt4())
    print(res)
